2013/12/11

緯度経度を欲しいフォーマットに整形するjavascriptミニライブラリ GeoFormat.js を作りました

最近ほとんど更新してなかったブログ、最終投稿から1年経ってました。。。。

FOSS4Gアドベントカレンダー2013で、2013/12/11 の担当になったので、記事を書くことになりました。

といっても、普段GISをほとんど使わない身としては、身近なFOSS4Gといえば99%OpenLayersのみ。。。

アドベントカレンダーの参加者の皆さんが、非常に濃い内容の記事を日々アップされている(プレッシャー!!)ので、いきなりバトンを落としそうになっていますが、、、、
無理なものは無理。今日はお気軽な内容で一息ついてください。まあ、忘年会シーズンの休肝日みたいなものです(苦笑)

さて、先日のジオメディアサミットにて地図ドア(bit.ly/chizudoor)というガジェット(オモチャ)を発表しました。これは、
の15のWEBサービス間で、地図の中心を維持しつつ、別のWebサービスを開く、というものです。
WEB地図サービス間をシームレスに自由に行き来するドア、「地図ドア」です。
おまけで、KML出力でGoogleEarthにも飛べるようになってます。
ブラウザ拡張機能を使っていて、各社サービス内のjavascriptを勝手にハックして現在表示中の地図中心座標を取得し、行き先URLのパラメータに緯度経度を渡してページを開いてます。
勝手にハックしているので、(各社のサービス更新などによて)いつ動かなくなるか分からないのがイタイところです。




さて、これを作ってる時もそうですが、緯度経度を各社のURLを整形する時にいつも思うのが、各社緯度経度のフォーマットが非常にバラバラなこと。まあ、決まりがないので自由といえば自由なのですが。
各社が利用している「緯度経度のフォーマット」を整理すると以下の通りとなりました。(ちなみに2005年にここギコ!さんと作った「MapSurfer」というアプリのときに調べた結果と並べてみた。)
フォーマット
2006年
現在
度(小数点付の実数)
GoogleMaps
MSN Live!
MapQuest
GoogleMaps
Bing Map
excite
BIGLOBE
地理院地図
OpenStreetMap
Mapion(
日本測地系)
LiveDoor
地図(日本測地系)
方位文字(n/e/w/s)
+度(整数)
+分(整数)
+秒(小数点付実数)
MapFan(日本測地系)
Its-mo Guide(
日本測地系)
Goo
地図(日本測地系)
ライブドア地図(日本測地系)
Goo地図(日本測地系)
MapFan(
日本測地系)
度(符号付整数)
+分(整数)
+秒(小数点付実数)
Mapion/MapionBB(日本測地系)
NAVITIME(
日本測地系)
ALPS
ラボ(日本測地系)
Yahoo!Map(
日本測地系)
MSN
マップ(日本測地系)
NAVITIME(日本測地系)
秒(少数付実数)
ちず丸(日本測地系)
 
ミリ秒(整数)
 
Mapple
いつもNAVI

2006年と比べると傾向として、
  • 度/分/秒の分離型の減って、度の実数を使うところが増えた
  • 日本測地系を使うところが減った
感じですね。




さて、このフォーマット変換、変換そのものは大したことない式ですが、このようなアプリを作るにはいちいち各社のフォーマットに整形しないといけないので、非常に面倒くさい。使い勝手のよいフォーマット機能もなさそう。特にJavaScriptだと分を算出しようとしても
35.12345-35 = 0.12344999999999828(おいおい!)
とかになったりして、誤差が出てしまったりするし。

というわけで、需要はあまり無いと思うけど、緯度経度用のフォーマット出力用ミニライブラリ GeoFormat.jp を作ってみました。ダウンロードはこちら


使い方
① 緯度経度を引数にインスタンスを作成。引数は緯度、経度の順で、「度」「度、分」「度、分、秒」のいずれかで指定する
例:
var gf = new GeoFormat(35.12345, 135.12345);
var gf = new GeoFormat(35, 7.407, 135, 7.407);
var gf = new GeoFormat(35, 7, 24.42, 135, 7, 24.42);


②インスタンスは二つのメンバオブジェクトを持つ
lat
lon

③このメンバオブジェクトはそれぞれ以下のメンバ関数を持ってます。
すべてフォーマット出力用で文字列を返します。(例 -135度12分46.789秒)
deg(format_formula) //角度を度で表したもの。符号付実数 -135.2129969444444
min(format_formula) //分以下の値。実数。常にプラス 12.77981666666667
sec(format_formula) //秒以下の値。実数。常にプラス 46.789
msec(format_formula) //1秒未満のミリ秒を返す。常にプラス 7890.0000
fullmin(format_formula) //角度を分で表したもの。符号付実数 -8112.779816666664
fullsec(format_formula) //角度を秒で表したもの。符号付実数 486766.7889999998
fullmsec(format_formula)//角度をミリ秒で表したもの。符号付実数 486766788.9999998
rad(format_formula) //角度をラジアンで表したもの。プラスの実数 3.9232733190099993238303058379106

フォーマット書式はC言語系のprintfの書式をベースに簡素化したものにしました
型指定
%d 符号付整数で表示
%u 符号なし整数で表示
%f 符号付小数点で表示

オプション
"+"  正のときでも「+」を表示する
"a" aspect:符号の代わりに n/s(緯度のとき)、e/w(経度のとき)を数字の前につける ※これはC言語系printf書式にはない独自拡張
"A" Aspect:符号の代わりに N/S(緯度のとき)、E/W(経度のとき)を数字の前につける ※これはC言語系printf書式にはない独自拡張
" "(スペース)幅指定ありで桁数が足りないとき、スペースで埋める
"0"(スペース)幅指定ありで桁数が足りないとき、ゼロで埋める


幅指定 Nまたは N.N 形式で指定
例 35.12345(緯度)
"%04d"   0035
"%+04d"   +035
"%04.3f"   0035.123
"%.3f" 35.123
"%a.3f" n35.123
"%A04.3f" N035.123


これを使うと、フォーマットが楽になります。
例えば、35.12345,135.12345(35°7分24.42秒、135°7分24.42秒、) の座標を使うとして
    var gf = new GeoFormat(35.12345,135.12345);
としておけば、

GoogleMapsのURL 
www.google.co.jp/maps?q=35.12345,135.12345

"www.google.co.jp/maps?q="+gf.lat.deg("%f")+","+gf.lon.deg("%f")
と書けば出力できます。

Goo地図の場合
link.maps.goo.ne.jp/map.php?MAP=E135.7.24.42N35.7.24.42&ZM=9

"link.maps.goo.ne.jp/map.php?MAP=" +gf.lon.deg("%Ad")+"."+gf.lon.min("%d")+"."+gf.lon.sec("%f")
+gf.lat.deg("%Ad")+"."+gf.lat.min("%d")+"."+gf.lat.sec("%f")+"&ZM=9"
と書けば出力できます。

いつもNAVIの場合、mSEC単位なので
www.its-mo.com/z-486444420-126444420-15.htm

"www.its-mo.com/z-"+gf.lon.msec("%d")+"-"+gf.lat.msec("%d")+"-15.htm"
と書けば出力できます。


100%自分用に作ったものですが、よかったら使ってください!
もちろんオープンソース!!
/*

  GeoFormat.js
 
  version 1.0
  Dec.11.2013
 
  Copyright (c) 2013 by Naoki Ueda
  Published under the 2-clause BSD license.
  See http://openlayers.org/dev/license.txt for the full text of the license
 
*/

というところでお茶を濁して、アドベントカレンダーの記事とさせて頂きます。。。


0 件のコメント: